﻿using UnityEngine;

public class EllipticalMotion : MonoBehaviour
{
    [Header("椭圆参数")]
    [Tooltip("椭圆的长轴半径")]
    public float semiMajorAxis = 3f; // 椭圆长轴半径
    [Tooltip("椭圆的短轴半径")]
    public float semiMinorAxis = 2f; // 椭圆短轴半径
    [Tooltip("运动速度")]
    public float speed = 1f; // 运动速度
    [Tooltip("是否使用物理系统")]
    public bool usePhysics = false; // 是否使用物理系统

    private Rigidbody2D rb;
    private Vector2 centerPosition; // 椭圆中心位置
    private float angle = 0f; // 当前角度

    private void Start()
    {
        // 获取或添加Rigidbody2D组件
        if (usePhysics)
        {
            rb = GetComponent<Rigidbody2D>();
            if (rb == null)
            {
                rb = gameObject.AddComponent<Rigidbody2D>();
                rb.gravityScale = 0; // 禁用重力
            }
        }

        // 记录椭圆中心位置（默认为物体初始位置）
        centerPosition = transform.position;
    }

    private void Update()
    {
        if (!usePhysics)
        {
            // 不使用物理系统，直接更新位置
            UpdatePosition();
        }
    }

    private void FixedUpdate()
    {
        if (usePhysics)
        {
            // 使用物理系统，在FixedUpdate中更新位置
            UpdatePosition();
        }
    }

    private void UpdatePosition()
    {
        // 增加角度
        angle += speed * Time.deltaTime;
        if (angle >= 360f) angle -= 360f;

        // 将角度转换为弧度
        float radians = angle * Mathf.Deg2Rad;

        // 计算椭圆上的位置
        float x = centerPosition.x + semiMajorAxis * Mathf.Cos(radians);
        float y = centerPosition.y + semiMinorAxis * Mathf.Sin(radians);

        if (usePhysics && rb != null)
        {
            // 使用物理系统时，移动Rigidbody
            rb.MovePosition(new Vector2(x, y));
        }
        else
        {
            // 直接设置位置
            transform.position = new Vector2(x, y);
        }
    }

    // 在编辑器中绘制椭圆路径（仅在场景视图可见）
    private void OnDrawGizmos()
    {
        if (!Application.isPlaying)
        {
            // 未运行时，使用当前变换位置作为中心
            centerPosition = transform.position;
        }

        Gizmos.color = Color.green;
        Gizmos.DrawWireSphere(centerPosition, 0.1f); // 标记中心点

        // 绘制椭圆路径
        Vector3 prevPos = (Vector3)centerPosition + new Vector3(semiMajorAxis, 0, 0);
        for (float a = 0; a <= 360; a += 10f)
        {
            float rad = a * Mathf.Deg2Rad;
            float x = semiMajorAxis * Mathf.Cos(rad);
            float y = semiMinorAxis * Mathf.Sin(rad);
            Vector3 pos = (Vector3)centerPosition + new Vector3(x, y, 0);
            Gizmos.DrawLine(prevPos, pos);
            prevPos = pos;
        }
        Gizmos.DrawLine(prevPos, (Vector3)centerPosition + new Vector3(semiMajorAxis, 0, 0));
    }
}